diff --git a/user_guide/nav/hacks.txt b/user_guide/nav/hacks.txt
index 8c17f00..183481b 100644
--- a/user_guide/nav/hacks.txt
+++ b/user_guide/nav/hacks.txt
@@ -1,6 +1,6 @@
 I did the following hack in moo.fx.js:
 
-At line 79 in the toggle: function()  function, I added:
+At line 79 in the toggle: function() function, I added:
 
 document.getElementById('nav').style.display = 'block';
 
diff --git a/user_guide/nav/moo.fx.js b/user_guide/nav/moo.fx.js
index 256371d..b21ee20 100755
--- a/user_guide/nav/moo.fx.js
+++ b/user_guide/nav/moo.fx.js
@@ -25,8 +25,8 @@
 	},
 
 	step: function() {
-		var time  = (new Date).getTime();
-		var Tpos   = (time - this.startTime) / (this.duration);
+		var time = (new Date).getTime();
+		var Tpos  = (time - this.startTime) / (this.duration);
 		if (time >= this.duration+this.startTime) {
 			this.now = this.to;
 			clearInterval (this.timer);
diff --git a/user_guide/nav/prototype.lite.js b/user_guide/nav/prototype.lite.js
index e6c3622..857faae 100755
--- a/user_guide/nav/prototype.lite.js
+++ b/user_guide/nav/prototype.lite.js
@@ -1,9 +1,9 @@
-/*  Prototype JavaScript framework
- *  (c) 2005 Sam Stephenson <sam@conio.net>
+/* Prototype JavaScript framework
+ * (c) 2005 Sam Stephenson <sam@conio.net>
  *
- *  Prototype is freely distributable under the terms of an MIT-style license.
+ * Prototype is freely distributable under the terms of an MIT-style license.
  *
- *  For details, see the Prototype web site: http://prototype.conio.net/
+ * For details, see the Prototype web site: http://prototype.conio.net/
  *
 /*--------------------------------------------------------------------------*/
 
@@ -11,117 +11,117 @@
 //note: this is a stripped down version of prototype, to be used with moo.fx by mad4milk (http://moofx.mad4milk.net).
 
 var Class = {
-  create: function() {
+ create: function() {
 	return function() {
-	  this.initialize.apply(this, arguments);
+	 this.initialize.apply(this, arguments);
 	}
-  }
+ }
 }
 
 Object.extend = function(destination, source) {
-  for (property in source) {
+ for (property in source) {
 	destination[property] = source[property];
-  }
-  return destination;
+ }
+ return destination;
 }
 
 Function.prototype.bind = function(object) {
-  var __method = this;
-  return function() {
+ var __method = this;
+ return function() {
 	return __method.apply(object, arguments);
-  }
+ }
 }
 
 function $() {
-  var elements = new Array();
+ var elements = new Array();
 
-  for (var i = 0; i < arguments.length; i++) {
+ for (var i = 0; i < arguments.length; i++) {
 	var element = arguments[i];
 	if (typeof element == 'string')
-	  element = document.getElementById(element);
+	 element = document.getElementById(element);
 
 	if (arguments.length == 1)
-	  return element;
+	 return element;
 
 	elements.push(element);
-  }
+ }
 
-  return elements;
+ return elements;
 }
 
 //-------------------------
 
 document.getElementsByClassName = function(className) {
-  var children = document.getElementsByTagName('*') || document.all;
-  var elements = new Array();
+ var children = document.getElementsByTagName('*') || document.all;
+ var elements = new Array();
 
-  for (var i = 0; i < children.length; i++) {
+ for (var i = 0; i < children.length; i++) {
 	var child = children[i];
 	var classNames = child.className.split(' ');
 	for (var j = 0; j < classNames.length; j++) {
-	  if (classNames[j] == className) {
+	 if (classNames[j] == className) {
 		elements.push(child);
 		break;
-	  }
+	 }
 	}
-  }
+ }
 
-  return elements;
+ return elements;
 }
 
 //-------------------------
 
 if (!window.Element) {
-  var Element = new Object();
+ var Element = new Object();
 }
 
 Object.extend(Element, {
-  remove: function(element) {
+ remove: function(element) {
 	element = $(element);
 	element.parentNode.removeChild(element);
-  },
+ },
 
-  hasClassName: function(element, className) {
+ hasClassName: function(element, className) {
 	element = $(element);
 	if (!element)
-	  return;
+	 return;
 	var a = element.className.split(' ');
 	for (var i = 0; i < a.length; i++) {
-	  if (a[i] == className)
+	 if (a[i] == className)
 		return true;
 	}
 	return false;
-  },
+ },
 
-  addClassName: function(element, className) {
+ addClassName: function(element, className) {
 	element = $(element);
 	Element.removeClassName(element, className);
 	element.className += ' ' + className;
-  },
+ },
 
-  removeClassName: function(element, className) {
+ removeClassName: function(element, className) {
 	element = $(element);
 	if (!element)
-	  return;
+	 return;
 	var newClassName = '';
 	var a = element.className.split(' ');
 	for (var i = 0; i < a.length; i++) {
-	  if (a[i] != className) {
+	 if (a[i] != className) {
 		if (i > 0)
-		  newClassName += ' ';
+		 newClassName += ' ';
 		newClassName += a[i];
-	  }
+	 }
 	}
 	element.className = newClassName;
-  },
+ },
 
-  // removes whitespace-only text node children
-  cleanWhitespace: function(element) {
+ // removes whitespace-only text node children
+ cleanWhitespace: function(element) {
 	element = $(element);
 	for (var i = 0; i < element.childNodes.length; i++) {
-	  var node = element.childNodes[i];
-	  if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+	 var node = element.childNodes[i];
+	 if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
 		Element.remove(node);
 	}
-  }
+ }
 });
\ No newline at end of file
